home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / e / kyz_obj.lha / test / cdplaytest.e < prev    next >
Text File  |  1998-10-20  |  5KB  |  159 lines

  1. -> mini CD³² CD player - joypad controlled, no output
  2. ->
  3. -> play - play/pause/unpause
  4. -> blue - stop/spindown
  5. -> red  - restart current track
  6. -> click left/right shoulder - skip track back/forward
  7. -> left/right on directional pad - search back/forward
  8.  
  9. MODULE '*cdplayer', 'lowlevel', 'libraries/lowlevel'
  10.  
  11. DEF cd=NIL:PTR TO cdplayer, list[100]:ARRAY OF CHAR, listpos,
  12.     playing, startplay, searching = FALSE, direction,
  13.     playbtn = 0, bluebtn = 0, greybtn = 0, redbtn = 0
  14.  
  15. PROC main() HANDLE
  16.   IF lowlevelbase := OpenLibrary('lowlevel.library', 40)
  17.     NEW cd.open()
  18.     mainloop()
  19.   ENDIF
  20. EXCEPT DO
  21.   END cd
  22.   CloseLibrary(lowlevelbase)
  23. ENDPROC
  24.  
  25. PROC mainloop()
  26.   DEF c1, c2, control
  27.  
  28.   stop()
  29.  
  30.   REPEAT
  31.     WaitTOF()
  32.     c1 := ReadJoyPort(0)
  33.     c2 := ReadJoyPort(1)
  34.  
  35.     control := (IF c1 AND JP_TYPE_GAMECTLR THEN c1 ELSE 0) OR
  36.                (IF c2 AND JP_TYPE_GAMECTLR THEN c2 ELSE 0)
  37.  
  38.     check_buttons(control)
  39.  
  40.     IF startplay AND cd.discinserted() THEN start_play()
  41.     IF playing
  42.       IF cd.discinserted() = FALSE THEN stop()
  43.       IF cd.playing() = FALSE THEN advance_play()
  44.     ENDIF
  45.  
  46.   UNTIL CtrlC()
  47. ENDPROC
  48.  
  49. ->------------------------------------------------------------------------------
  50.  
  51. CONST PLAY    = JPF_BUTTON_PLAY
  52. CONST RED     = JPF_BUTTON_RED
  53. CONST BLUE    = JPF_BUTTON_BLUE
  54. CONST FORWARD = JPF_BUTTON_FORWARD
  55. CONST REVERSE = JPF_BUTTON_REVERSE
  56. CONST LEFT    = JPF_JOY_LEFT
  57. CONST RIGHT   = JPF_JOY_RIGHT
  58.  
  59. PROC check_buttons(c)
  60.   -> if play button pressed, try to start play.
  61.   -> if already playing, it toggles pause
  62.  
  63.   IF button(c AND PLAY, {playbtn})
  64.     IF playing THEN toggle_pause() ELSE startplay := TRUE
  65.   ENDIF
  66.  
  67.   -> if blue is pressed, stop play. if already stopped, turn off motor
  68.   IF button(c AND BLUE, {bluebtn})
  69.     IF playing THEN stop() ELSE cd.spindown()
  70.   ENDIF
  71.  
  72.   -> if a shoulder button is pressed, skip forward or back (if playing)
  73.   IF button(c AND (FORWARD OR REVERSE), {greybtn})
  74.     IF playing THEN IF c AND REVERSE THEN prev() ELSE next(FALSE)
  75.   ENDIF
  76.  
  77.   -> red restarts the current track
  78.   IF button(c AND RED, {redbtn})
  79.     IF playing THEN play()
  80.   ENDIF
  81.  
  82.   -> if left/right is pressed, search forward or back (if playing)
  83.   IF c AND (LEFT OR RIGHT)
  84.     IF playing AND (searching = FALSE)
  85.       searching := TRUE
  86.       direction := IF c AND LEFT THEN CDSEARCH_BACK ELSE CDSEARCH_FWD
  87.       cd.search(direction)
  88.     ENDIF
  89.   ELSE
  90.     IF searching THEN cd.search(CDSEARCH_STOP) BUT searching := FALSE
  91.   ENDIF
  92. ENDPROC
  93.  
  94. PROC start_play()
  95.   -> request to start play has been made. we try to get a list of playable
  96.   -> tracks. if there are some, we can enter playmode
  97.   IF make_list() THEN cd.unpause() BUT play()
  98.   startplay := FALSE
  99. ENDPROC
  100.  
  101. PROC advance_play()
  102.   -> play will have stopped either because we have reached the end of
  103.   -> the track, or reached the start of the track (via backwards search)
  104.   -> if we reached the start, turn off search mode and play the track again.
  105.   -> otherwise, play the next track
  106.  
  107.   IF searching AND (direction = CDSEARCH_BACK)
  108.     cd.search(CDSEARCH_STOP); play()
  109.   ELSE
  110.     next(TRUE)
  111.   ENDIF
  112. ENDPROC
  113.  
  114. ->------------------------------------------------------------------------------
  115.  
  116. PROC make_list()
  117.   -> build a list of all audio tracks on the CD
  118.   -> return TRUE if there are any audio tracks on the CD
  119.   DEF m=0, n
  120.  
  121.   FOR n := 1 TO cd.tracks() DO IF
  122.     cd.trackinfo(n) = CDTRACK_AUDIO THEN list[m++] := n
  123.  
  124.   list[m] := 0 -> null-terminate after last entry in list
  125.   listpos := 0 -> set list pointer to start of list
  126. ENDPROC (m > 0)
  127.  
  128. PROC prev()
  129.   -> play previous track (if at first track, play first track again)
  130.   IF listpos-- < 0 THEN listpos := 0; play()
  131. ENDPROC
  132.  
  133. PROC next(stop_at_end)
  134.   -> play next track in list. if stop_at_end set then stop after final track
  135.   -> otherwise play final track again
  136.   listpos++
  137.   IF list[listpos] THEN play() ELSE IF
  138.     stop_at_end THEN stop() ELSE listpos-- BUT play()
  139. ENDPROC
  140.  
  141. PROC play()
  142.   -> play currently selected track
  143.   DEF type, offset, length
  144.   type, offset, length := cd.trackinfo(list[listpos])
  145.   playing := TRUE
  146.   cd.play(offset, length)
  147. ENDPROC
  148.  
  149. PROC stop() IS cd.stop() BUT playing := FALSE
  150.  
  151. PROC toggle_pause() IS IF cd.paused() THEN cd.unpause() ELSE cd.pause()
  152.  
  153. PROC button(b, s)
  154.   -> tests against a particular joypad buttonset. Only returns TRUE on the
  155.   -> initial press of the button(s), and button(s) must be released before
  156.   -> pressing again returns TRUE
  157.   IF b; IF ^s = 0; ^s := 1; RETURN TRUE; ENDIF; ELSE; ^s := 0; ENDIF
  158. ENDPROC FALSE
  159.